[小旅]cliでrole削除に失敗したので解決策をhelpで探した
cliはなれてくるととても便利です。cliコマンド(aws iam delete-role
)で不要になったrole削除時にpolicyとの依存関係にハマりhelpを使用してroleを削除するまで必要なコマンドを探したのでまとめます。
最終的に使用したコマンド
最終的にroleを削除するまでに使用したコマンドをまとめます。
- policyのarnを取得する
- policyのarnを使用してroleからデタッチする
- roleの削除
list-attached-role-policies
を使用して削除したいroleにアタッチされているpolicyを確認します。削除したいrole名を指定します。
$ aws iam list-attached-role-policies --role-name role名 --profile プロファイル名
detach-role-policy
を使用してroleからpolicyをデタッチします。削除したいrole名とデタッチするpolicyのarnを指定します。
$ aws iam detach-role-policy --role-name role名 --policy-arn ポリシーarn --profile プロファイル名
delete-role
を使用して削除したいrole名を指定し削除します。
$ aws iam delete-role --role-name role名 --profile プロファイル名
roleを削除するコマンド探しの旅
では、上記の流れになるまでに調べたコマンドについてまとめます。
1. role削除時のpolicyとの依存関係
delete-role
を使用しroleを削除します。すると以下のエラーが発生しました。
$ aws iam delete-role --role-name ロール名 --profile プロファイル名 An error occurred (DeleteConflict) when calling the DeleteRole operation: Cannot delete entity, must detach all policies first.
must detach all policies first
より、role削除の前にpolicyをroleからデタッチする必要があることがわかります。
2. デタッチ方法の検索
aws iam
にデタッチする方法がないかhelpコマンドを使用して検索しました。
$ aws iam help ... AVAILABLE COMMANDS ... o detach-group-policy o detach-role-policy o detach-user-policy
detachコマンドがありました!6行目のdetach-role-policy
を使用することでroleからpolicyをデタッチできそうです。こちらのコマンドについてhelpで使い方を調べます。
$ aws iam detach-role-policy help ... SYNOPSIS detach-role-policy --role-name <value> --policy-arn <value> [--cli-input-json | --cli-input-yaml] [--generate-cli-skeleton <value>] [--cli-auto-prompt <value>]
実行時にrole名
とpolicyのarn
が必要であることがわかりました。
3. policyのarn取得方法の模索
デタッチするには、削除するroleにアタッチされているpolicyのarnを取得する必要があります。
roleにアタッチしているpolicyのarnを検索する方法をhelpで検索します。
$ aws iam help ... AVAILABLE COMMANDS ... o get-policy o get-role o get-role-policy ... o list-attached-group-policies o list-attached-role-policies o list-attached-user-policies
getかlistで取得できそうです。名前からroleにアタッチされているpolicyを探せそうな、get-role
、get-role-policy
、list-attached-role-policies
について深掘りします。
- get-role
Outputを確認しアタッチされているpolicyの情報は取得できない事がわかりました。
$ aws iam get-role help ... Output: { "Role": { "Description": "Test Role", "AssumeRolePolicyDocument":"<URL-encoded-JSON>", "MaxSessionDuration": 3600, "RoleId": "AROA1234567890EXAMPLE", "CreateDate": "2019-11-13T16:45:56Z", "RoleName": "Test-Role", "Path": "/", "RoleLastUsed": { "Region": "us-east-1", "LastUsedDate": "2019-11-13T17:14:00Z" }, "Arn": "arn:aws:iam::123456789012:role/Test-Role" } }
実行時にpolicyの名前を指定する必要があり今回の用途にあいません。
$ aws iam get-role-policy help ... SYNOPSIS get-role-policy --role-name <value> --policy-name <value>
Outputの項目よりPolicyArnが取得できる事が確認出来ました!実行時の指定もrole名のみで今回の用途に最適です。
$ aws iam list-attached-role-policies help ... SYNOPSIS list-attached-role-policies --role-name <value> ... Output: { "AttachedPolicies": [ { "PolicyName": "SecurityAudit", "PolicyArn": "arn:aws:iam::aws:policy/SecurityAudit" } ], "IsTruncated": false }
4. policyをデタッチする
先ほど調べたlist-attached-role-policies
を使用してpolicyのarnを調べます。
$ aws iam list-attached-role-policies --role-name role名 --profile cm-da { "AttachedPolicies": [ { "PolicyName": policy名1, "PolicyArn": policy-arn1 }, { "PolicyName": policy名2, "PolicyArn": policy-arn2 } ] }
結果より2つのpolicyがアタッチされていることがわかります。
取得したpolicyのarnを使用してroleからpolicyをデタッチします。
$ aws iam detach-role-policy --role-name role名 --policy-arn policy-arn1 --profile プロファイル名 $ aws iam detach-role-policy --role-name role名 --policy-arn policy-arn2 --profile プロファイル名
5. roleを削除する
roleからpolicyをデタッチしたので、roleの削除を行います。
$ aws iam delete-role --role-name ロール名 --profile プロファイル名
エラー文もなく今度は無事に削除されました!
まとめ
helpを使用して必要なコマンドを探す旅について沖縄の下地がお届けしました。cliでroleを削除するのは簡単だろうと思っていたらpolicyとの依存関係により一発では出来ませんでしたが、helpを使用してコマンドを探したり構文を確認したりとても便利だと実感しました。この記事がどなたかの助けになれば幸いです。